﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Caixa.Model.Interface;
using Caixa.BLL;
using Caixa.Model;
using System.Transactions;

namespace Caixa
{
	public partial class Frm_Favorecido : Caixa.Frm_Base
	{
		#region " Constructor "

		public Frm_Favorecido()
		{
			InitializeComponent();
		}

		#endregion

		#region " Events "

		private void rdbDOCTipoFavorecidoFisica_CheckedChanged(object sender, EventArgs e)
		{
			if (rdb_TipoFavorecidoFisica.Checked)
			{
				lbl_CPFCNPJ.Text = "CPF";
				txt_CPFCNPJ.Mask = "999,999,999-99";
			}
		}

		private void rdbDOCTipoFavorecidoJuridica_CheckedChanged(object sender, EventArgs e)
		{
			if (rdb_TipoFavorecidoJuridica.Checked)
			{
				lbl_CPFCNPJ.Text = "CNPJ";
				txt_CPFCNPJ.Mask = "99,999,999/9999-99";
			}
		}

		private void btnConfirmar_Click(object sender, EventArgs e)
		{
			if (!ValidaPreenchimentoCampos())
				return;

			this.Visible = false;

			bool sucess = false;

			Frm_Processando frm_Processando = new Frm_Processando();
			frm_Processando.Show();
			frm_Processando.Refresh();
			System.Threading.Thread.Sleep(500);

			// Cadastra o Favorecido
			sucess = CadastraFavorecido();

			if (sucess)
			{
				frm_Processando.Mensagem = "Favorecido Cadastrado com sucesso!";
				frm_Processando.Visible = false;
				frm_Processando.KeyPreview = true;
				frm_Processando.ShowDialog();
			}
			else
			{
				frm_Processando.Dispose();
				this.Visible = true;
			}
		}

		private void btnCancelar_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		#endregion

		#region " Methods "

		#region " Favorecido "

		private bool CadastraFavorecido()
		{
			bool sucess = false;

			try
			{
				using (TransactionScope ts = new TransactionScope())
				{
					IDestinatarioTransacao favorecido;

					if (rdb_TipoFavorecidoJuridica.Checked)
						favorecido = CadastraFavorecidoPessoaJuridica();
					else
						favorecido = CadastraFavorecidoPessoaFisica();

					sucess = ContaBLL.RelacionaFavorecido(CaixaEletronicoBLL.ContaLogada.ID, favorecido.ID);

					ts.Complete();
				}
			}
			catch (Exception e)
			{
				sucess = false;
				MessageBox.Show(e.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			}

			return sucess;
		}

		private IDestinatarioTransacao CadastraFavorecidoPessoaFisica()
		{
			string cpf = txt_CPFCNPJ.Text.Replace(".", "").Replace("-", "");
			DestinatarioTransacaoPessoaFisica destinatario = DestinatarioTransacaoPessoaFisicaBLL.GetByCPF(cpf);
			bool exists = (destinatario != null);

			if (exists)
				exists = ContaBLL.ExisteFavorecido(CaixaEletronicoBLL.ContaLogada.ID, destinatario.ID);

			if (exists)
				throw new Exception("Favorecido já cadastrado!");

			destinatario = new DestinatarioTransacaoPessoaFisica();

			destinatario.CPF = cpf;
			destinatario.Nome = txt_NomeFavorecido.Text;

			int numeroBanco;
			int.TryParse(txt_Banco.Text, out numeroBanco);
			Banco banco = BancoBLL.GetByNumero(numeroBanco);
			if (banco == null)
				throw new Exception("Banco de destino inválido!");
			destinatario.IDBanco = banco.ID;

			int numeroAgencia;
			int.TryParse(txt_Agencia.Text, out numeroAgencia);
			destinatario.NumeroAgencia = numeroAgencia;

			int numeroConta;
			int.TryParse(txt_Conta.Text, out numeroConta);
			destinatario.NumeroConta = numeroConta;

			if (!exists)
				destinatario.ID = DestinatarioTransacaoPessoaFisicaBLL.Insert(destinatario);

			return destinatario;
		}

		private IDestinatarioTransacao CadastraFavorecidoPessoaJuridica()
		{
			string cnpj = txt_CPFCNPJ.Text.Replace(".", "").Replace("/", "").Replace("-", "");
			DestinatarioTransacaoPessoaJuridica destinatario = DestinatarioTransacaoPessoaJuridicaBLL.GetByCNPJ(cnpj);
			bool exists = (destinatario != null);

			if (exists)
				exists = ContaBLL.ExisteFavorecido(CaixaEletronicoBLL.ContaLogada.ID, destinatario.ID);

			if (exists)
				throw new Exception("Favorecido já cadastrado!");

			destinatario = new DestinatarioTransacaoPessoaJuridica();

			destinatario.CNPJ = cnpj;
			destinatario.Nome = txt_NomeFavorecido.Text;

			int numeroBanco;
			int.TryParse(txt_Banco.Text, out numeroBanco);
			Banco banco = BancoBLL.GetByNumero(numeroBanco);
			if (banco == null)
				throw new Exception("Banco de destino inválido!");
			destinatario.IDBanco = banco.ID;

			int numeroAgencia;
			int.TryParse(txt_Agencia.Text, out numeroAgencia);
			destinatario.NumeroAgencia = numeroAgencia;

			int numeroConta;
			int.TryParse(txt_Conta.Text, out numeroConta);
			destinatario.NumeroConta = numeroConta;

			if (!exists)
				destinatario.ID = DestinatarioTransacaoPessoaJuridicaBLL.Insert(destinatario);

			return destinatario;
		}

		#endregion

		#region " Validação "

		public bool ValidaPreenchimentoCampos()
		{
			bool isValid = false;
			try
			{
				if (string.IsNullOrEmpty(txt_Banco.Text.Trim()))
					throw new Exception("Preencha o banco.");

				if (string.IsNullOrEmpty(txt_Agencia.Text.Trim()))
					throw new Exception("Preencha a agência.");

				if (string.IsNullOrEmpty(txt_Conta.Text.Trim()))
					throw new Exception("Preencha a conta.");

				if (string.IsNullOrEmpty(txt_CPFCNPJ.Text.Replace(".", "").Replace("/", "").Replace("-", "").Trim()))
					throw new Exception("Preencha o CPF/CNPJ.");

				if (string.IsNullOrEmpty(txt_NomeFavorecido.Text.Trim()))
					throw new Exception("Preencha o nome do favorecido.");

				int numeroBanco;
				int.TryParse(txt_Banco.Text, out numeroBanco);
				Banco banco = BancoBLL.GetMySelf();
				if (banco.Numero.Equals(numeroBanco))
					throw new Exception(string.Format("Banco do favorecido [Bco: {0}] não pode ser o mesmo do remetente.", numeroBanco));

				isValid = true;
			}
			catch (Exception e)
			{
				isValid = false;
				MessageBox.Show(e.Message, "Mensagem", MessageBoxButtons.OK, MessageBoxIcon.Warning);
			}

			return isValid;
		}

		#endregion

		#endregion
	}
}
